class Observer {
  constructor(data) {
    this.walk(data);
  }
  walk(data){
    //1.判断data是否是对象
    if (!data || typeof data !== 'object') {
      return
    }
    // 2.遍历data的属性
    Object.keys(data).forEach( key => {
      this.defineReactive(data, key, data[key]);
    })
   

  }

  defineReactive (obj, key, value) { //使用闭包，扩展了value的作用域
    const that = this ;
    //为每一个属性创建dep， 作用是收集依赖并发送通知
    let dep = new Dep();
    //如果value是对象，把value内部的属性转换成响应式数据（即getter/setter）    
      this.walk(value);
      Object.defineProperty(obj, key, {
        enumerable: true ,
        configurable: true ,
        get() {
          Dep.target && dep.addSub(Dep.target); //Dep.target存储的就是watcher对象
          return value //若这里返回的是data[key],就会触发get方法，发生死递归，导致堆栈溢出；
        } ,
        set(newValue ){
          if (newValue === value) {
            return
          }
          value = newValue ;
          //发送通知
          // this.walk(value); //这里的this指向的是data对象
          that.walk(value); 
          dep.notify()
        }
      })
  }
}